/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.ekaaty.server.mail;

import br.com.ekaaty.bean.Email;
import br.com.ekaaty.server.mail.propeties.PropretiesGeneric;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

/**
 *Essa classe tem a função de enviar
 * Email
 * @author otavio
 */
public class SendEmail {

    private PropretiesGeneric propreties;

    public SendEmail(PropretiesGeneric propreties) {
        this.propreties = propreties;
    }

    /**
     * Método responsável por enviar o email
     * @param email - Bean tendo informaçẽos a respeito da mensagem
     * @return true caso consiga e false para o nao êxito do envio
     */
    public boolean enviarEmail(Email email) {
        try {
            envairEmailEngine(email);
            return true;
        } catch (MessagingException ex) {
            return false;
        }
    }

    /**
     * método que encapsula todo o processo de envio de e-mail
     * @param email -bean qeu contém informaões para se enviar o e-mail
     * @throws MessagingException
     */
    private void envairEmailEngine(Email email) throws MessagingException {

        Properties props = propreties.getProperties();
        Session session = Session.getInstance(props, null);


        Message msg = createMessage(email, session);

        Multipart mp = new MimeMultipart();
        for (MimeBodyPart mbp : getPartesEmail(email)) {
            mp.addBodyPart(mbp);
        }
        // adiciona a Multipart na mensagem
        msg.setContent(mp);

        //        msg.setContent("Isso é um teste relaxe","text/plain");
        Transport tr;
        tr = session.getTransport("smtp"); //define smtp para transporte
                        /*
         *  1 - define o servidor smtp
         *  2 - seu nome de usuario do gmail
         *  3 - sua senha do gmail
         */

        tr.connect(propreties.getNameServer(), propreties.getLoginEmail().getLogin(), propreties.getLoginEmail().getSenha());
        msg.saveChanges(); // don't forget this
        //envio da mensagem
        tr.sendMessage(msg, msg.getAllRecipients());
        tr.close();


    }

    /**
     * Esse método tem a função de criar as partes do email
     * @param email - bean informações referente a mensagem
     * @return - Uma lista contando os corpos para a mensagem
     * @throws MessagingException
     */
    private List<MimeBodyPart> getPartesEmail(Email email) throws MessagingException {
        List<MimeBodyPart> mimeBodyParts = new ArrayList<MimeBodyPart>();
        mimeBodyParts.add(getParte1(email));
        mimeBodyParts.add(getParte2(email));
        return mimeBodyParts;
    }

    /**
     * Enseri a primeira parte que contém o texto do email
     * @param email -bean que contém o texto
     * @return
     * @throws MessagingException
     */
    private MimeBodyPart getParte1(Email email) throws MessagingException {
        MimeBodyPart mbp = new MimeBodyPart();
        mbp.setText(email.getTexto());
        return mbp;
    }

    /**
     * Esse método insere um anexo para a mensagem
     * @param email -bean no qual tem o arquivo a ser anexado
     * @return
     * @throws MessagingException
     */
    private MimeBodyPart getParte2(Email email) throws MessagingException {
        MimeBodyPart mbp = new MimeBodyPart();
        // anexa o arquivo na mensagem
        FileDataSource fds = new FileDataSource(email.getAnexo());
        mbp.setDataHandler(new DataHandler(fds));
        mbp.setFileName(fds.getName());

        return mbp;
    }

    private Message createMessage(Email email, Session session) throws MessagingException {
        Message msg = new MimeMessage(session);
        //Setando o destinatário
        msg.setRecipient(Message.RecipientType.TO, new InternetAddress(email.getPara()));
        //Setando a origem do email
        msg.setFrom(new InternetAddress(propreties.getLoginEmail().getLogin()));
        //Setando o assunto
        msg.setSubject(email.getAssunto());
        //Setando o conteúdo/corpo do email
        msg.setSentDate(new Date());

        return msg;
    }
}
